/*
1.  Dart单线程模型
在Java和Objective-C（以下简称“OC”）中，如果程序发生异常且没有被捕获，那么程序将会终止，
但是这在Dart或JavaScript中则不会！究其原因，这和它们的运行机制有关系。J
ava和OC都是多线程模型的编程语言，任意一个线程触发异常且该异常未被捕获时，就会导致整个进程退出。
但Dart和JavaScript不会，它们都是单线程模型，运行机制很相似(但有区别)

2. Flutter框架异常捕获
Flutter 框架为我们在很多关键的方法进行了异常捕获。这里举一个例子，当我们布局发生越界或不合规范时，
Flutter就会自动弹出一个错误界面，这是因为Flutter已经在执行build方法时添加了异常捕获，最终的源码如下：

@override
void performRebuild() {
 ...
  try {
    //执行build方法
    built = build();
  } catch (e, stack) {
    // 有异常时则弹出错误提示
    built = ErrorWidget.builder(_debugReportException('building $this', e, stack));
  }
  ...
}

如果我们想自己上报异常，只需要提供一个自定义的错误处理回调即可，如：

void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    reportError(details);
  };
 ...
}
 */

import 'dart:async';

import 'package:flutter/cupertino.dart';

import '../main.dart';
void collectLog(String line){
  print( "collectLog: $line"); //收集日志
}
void reportErrorAndLog(FlutterErrorDetails details){
  print( "reportErrorAndLog: $details");//上报错误和日志逻辑
}

FlutterErrorDetails makeDetails(Object obj, StackTrace stack){
  print( "makeDetails: $stack");// 构建错误信息
}

void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    reportErrorAndLog(details);
  };
  runZoned(
        () => runApp(MyApp()),
    zoneSpecification: ZoneSpecification(
      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
        collectLog(line); // 收集日志
      },
    ),
    onError: (Object obj, StackTrace stack) {
      var details = makeDetails(obj, stack);
      reportErrorAndLog(details);
    },
  );
}

